import * as Taro from '@tarojs/taro'
import { create } from 'zustand'
import { IUserResponse } from '../inteface/user'

// 用户 Store 状态接口定义
interface UserState {
  // 用户信息
  userInfo: IUserResponse | null
  // 是否已加载用户信息
  isLoaded: boolean
  // 是否正在加载
  isLoading: boolean

  // Actions
  // 设置用户信息
  setUserInfo: (userInfo: IUserResponse) => void
  // 更新用户信息（部分更新）
  updateUserInfo: (userInfo: Partial<IUserResponse>) => void
  // 清除用户信息
  clearUserInfo: () => void
  // 从本地存储加载用户信息
  loadUserInfoFromStorage: () => void
  // 保存用户信息到本地存储
  saveUserInfoToStorage: () => void
  // 设置加载状态
  setLoading: (isLoading: boolean) => void
}

// 本地存储的 key
const USER_INFO_STORAGE_KEY = 'userInfo'

// 创建用户信息 Store
export const useUserStore = create<UserState>((set, get) => ({
  userInfo: null,
  isLoaded: false,
  isLoading: false,

  // 设置用户信息
  setUserInfo: (userInfo: IUserResponse) => {
    set({
      userInfo,
      isLoaded: true,
      isLoading: false
    })
    // 自动保存到本地存储
    try {
      Taro.setStorageSync(USER_INFO_STORAGE_KEY, userInfo)
    } catch (error) {
      console.error('保存用户信息到本地存储失败:', error)
    }
  },

  // 更新用户信息（部分更新）
  updateUserInfo: (partialUserInfo: Partial<IUserResponse>) => {
    const { userInfo } = get()
    if (userInfo) {
      const updatedUserInfo = {
        ...userInfo,
        ...partialUserInfo,
      }
      set({
        userInfo: updatedUserInfo,
        isLoaded: true
      })
      // 保存到本地存储
      try {
        Taro.setStorageSync(USER_INFO_STORAGE_KEY, updatedUserInfo)
      } catch (error) {
        console.error('更新用户信息到本地存储失败:', error)
      }
    }
  },

  // 清除用户信息
  clearUserInfo: () => {
    set({
      userInfo: null,
      isLoaded: false,
      isLoading: false
    })
    // 清除本地存储
    try {
      Taro.removeStorageSync(USER_INFO_STORAGE_KEY)
    } catch (error) {
      console.error('清除本地存储的用户信息失败:', error)
    }
  },

  // 从本地存储加载用户信息
  loadUserInfoFromStorage: () => {
    try {
      const userInfo = Taro.getStorageSync(USER_INFO_STORAGE_KEY)
      if (userInfo) {
        set({
          userInfo,
          isLoaded: true,
          isLoading: false
        })
      } else {
        set({
          isLoaded: true,
          isLoading: false
        })
      }
    } catch (error) {
      console.error('从本地存储加载用户信息失败:', error)
      set({
        isLoaded: true,
        isLoading: false
      })
    }
  },

  // 保存用户信息到本地存储
  saveUserInfoToStorage: () => {
    const { userInfo } = get()
    if (userInfo) {
      try {
        Taro.setStorageSync(USER_INFO_STORAGE_KEY, userInfo)
      } catch (error) {
        console.error('保存用户信息到本地存储失败:', error)
      }
    }
  },

  // 设置加载状态
  setLoading: (isLoading: boolean) => {
    set({ isLoading })
  },
}))

// 导出便捷的 hooks
// 获取用户信息和状态
export const useUserInfo = () => {
  const { userInfo, isLoaded, isLoading } = useUserStore()
  return {
    userInfo,
    isLoaded,
    isLoading,
  }
}

// 获取用户操作方法
export const useUserActions = () => {
  const {
    setUserInfo,
    updateUserInfo,
    clearUserInfo,
    loadUserInfoFromStorage,
    saveUserInfoToStorage,
    setLoading,
  } = useUserStore()
  return {
    setUserInfo,
    updateUserInfo,
    clearUserInfo,
    loadUserInfoFromStorage,
    saveUserInfoToStorage,
    setLoading,
  }
}
